import { useAuthStore } from '@/stores/auth'

// 配置请求基础URL
const baseURL = 'https://tushuoit.com/api'

// 请求拦截器，添加token认证
uni.addInterceptor('request', {
  invoke(args) {
    // 获取认证存储
    const authStore = useAuthStore()
    
    // 添加基础URL
    if (!args.url.startsWith('http')) {
      args.url = baseURL + args.url
    }
    
    // 添加请求头
    if (!args.header) {
      args.header = {}
    }
    
    // 如果有token，添加到请求头
    if (authStore.token) {
      args.header.Authorization = `Bearer ${authStore.token}`
    }
    
    // 默认请求类型
    if (!args.method) {
      args.method = 'GET'
    }
    
    return args
  },
  
  success(res) {
    // 请求成功的处理
    if (res.statusCode === 200) {
      return res.data
    }
    
    // 处理401未授权错误
    if (res.statusCode === 401) {
      const authStore = useAuthStore()
      authStore.logout()
      
      // 跳转到登录页面
      uni.showToast({
        title: '身份验证已过期，请重新登录',
        icon: 'none'
      })
      
      // 延迟一下再跳转登录页
      setTimeout(() => {
        uni.navigateTo({
          url: '/pages/login/login'
        })
      }, 1500)
      
      return Promise.reject(new Error('身份验证已过期，请重新登录'))
    }
    
    // 处理其他错误
    uni.showToast({
      title: res.data?.message || '请求失败',
      icon: 'none'
    })
    
    return Promise.reject(new Error(res.data?.message || '请求失败'))
  },
  
  fail(err) {
    // 网络错误等情况处理
    uni.showToast({
      title: '网络异常，请检查网络连接',
      icon: 'none'
    })
    
    return Promise.reject(new Error('网络异常，请检查网络连接'))
  }
})

// 封装请求方法
export const request = (options) => {
  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      success: (res) => {
        resolve(res)
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

// 封装常用请求方法
export const http = {
  get(url, data = {}, options = {}) {
    return request({
      url,
      data,
      method: 'GET',
      ...options
    })
  },
  
  post(url, data = {}, options = {}) {
    return request({
      url,
      data,
      method: 'POST',
      ...options
    })
  },
  
  put(url, data = {}, options = {}) {
    return request({
      url,
      data,
      method: 'PUT',
      ...options
    })
  },
  
  delete(url, data = {}, options = {}) {
    return request({
      url,
      data,
      method: 'DELETE',
      ...options
    })
  }
}

export default http
